{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Master-Slave"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. **TaskQueue**：一个线程安全的任务队列。\n",
    "   - `push` 用于 Master 线程推入任务。\n",
    "   - `pop` 用于 Slave 线程获取任务，如果收到停止信号则返回空。\n",
    "   - `stop` 发出停止信号，唤醒所有工作线程。\n",
    "2. **process 函数**：模拟耗时任务（例如计算平方），使用 `std::this_thread::sleep_for` 模拟延时。\n",
    "3. **主函数流程**：\n",
    "   - 创建 `num_workers` 个工作线程。\n",
    "   - Master 线程循环产生 `total_tasks` 个任务并推入队列。\n",
    "   - 所有任务分发完成后调用 `task_queue.stop()`，通知工作线程退出。\n",
    "   - 主线程 `join` 所有工作线程，确保资源有序回收。\n",
    "\n",
    "此示例展示了典型的 Master-Slave 结构：Master 负责生产任务并将其放入任务队列，Slave 线程从队列中拉取任务执行，实现了简单的线程池式并行处理。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "vscode": {
     "languageId": "shellscript"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Master] 发布任务 0，payload = 1\n",
      "[Master] 发布任务 1，payload = 2\n",
      "[Worker 0] 处理任务 0，输入 1，输出 1\n",
      "[Master] 发布任务 2，payload = 3\n",
      "[Worker 1] 处理任务 1，输入 2，输出 4\n",
      "[Master] 发布任务 3，payload = 4\n",
      "[Worker 2] 处理任务 2，输入 3，输出 9\n",
      "[Master] 发布任务 4，payload = 5\n",
      "[Worker 3] 处理任务 3，输入 4，输出 16\n",
      "[Master] 发布任务 5，payload = 6\n",
      "[Worker 0] 处理任务 4，输入 5，输出 25\n",
      "[Master] 发布任务 6，payload = 7\n",
      "[Worker 1] 处理任务 5，输入 6，输出 36\n",
      "[Master] 发布任务 7，payload = 8\n",
      "[Worker 2] 处理任务 6，输入 7，输出 49\n",
      "[Master] 发布任务 8，payload = 9\n",
      "[Worker 3] 处理任务 7，输入 8，输出 64\n",
      "[Master] 发布任务 9，payload = 10\n",
      "[Worker 0] 处理任务 8，输入 9，输出 81\n",
      "[Worker 2] 收到退出信号。\n",
      "[Worker 3] 收到退出信号。\n",
      "[Worker 0] 收到退出信号。\n",
      "[Worker 1] 处理任务 9，输入 10，输出 100\n",
      "[Worker 1] 收到退出信号。\n",
      "[Master] 所有任务处理完毕，程序结束。\n"
     ]
    }
   ],
   "source": [
    "! cd Master-Slave && g++ -std=c++17 -pthread -O2 main.cpp -o master_slave && ./master_slave"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "codemirror_mode": "text/x-c++src",
   "file_extension": ".cpp",
   "mimetype": "text/x-c++src",
   "name": "C++17",
   "version": "17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
